using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._AviationTools._Airports._Analysis
{
    /// <summary>
    /// <para>Analyze Runway Obstacles</para>
    /// <para>Analyzes obstacle data and obstruction identification surfaces (OIS) to determine if obstacles are penetrating.</para>
    /// <para>分析障碍物数据和障碍物识别表面 （OIS），以确定障碍物是否穿透。</para>
    /// </summary>    
    [DisplayName("Analyze Runway Obstacles")]
    public class AnalyzeRunwayObstacles : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public AnalyzeRunwayObstacles()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_input_ois_features">
        /// <para>Input OIS Features</para>
        /// <para>The multipatch features with defined Airport schema. The feature class must be z-enabled.</para>
        /// <para>具有定义的 Airport 模式的多面体功能。要素类必须启用 z 功能。</para>
        /// </param>
        /// <param name="_input_obstacle_features">
        /// <para>Input Obstacle Features</para>
        /// <para>The input obstacle features that will be analyzed. The feature class must be z-enabled.</para>
        /// <para>将要分析的输入障碍物特征。要素类必须启用 z 功能。</para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output Obstacle Feature Class</para>
        /// <para>A feature class containing one point for each obstacle feature that falls within the area covered by the input OIS. If the geometry type of the input obstacle feature is a polyline or polygon, a multipoint feature class will be created.</para>
        /// <para>一个要素类，其中包含位于输入 OIS 覆盖区域内的每个障碍物要素的一个点。如果输入障碍物要素的几何类型为折线或面，则将创建多点要素类。</para>
        /// </param>
        public AnalyzeRunwayObstacles(object _input_ois_features, object _input_obstacle_features, object _out_feature_class)
        {
            this._input_ois_features = _input_ois_features;
            this._input_obstacle_features = _input_obstacle_features;
            this._out_feature_class = _out_feature_class;
        }
        public override string ToolboxName => "Aviation Tools";

        public override string ToolName => "Analyze Runway Obstacles";

        public override string CallName => "aviation.AnalyzeRunwayObstacles";

        public override List<string> AcceptEnvironments => ["workspace"];

        public override object[] ParameterInfo => [_input_ois_features, _input_obstacle_features, _out_feature_class, _height_field.GetGPValue(), _unit_field.GetGPValue(), _height_option.GetGPValue(), _elevation_option.GetGPValue(), _elevation_field, _elevation_field_unit.GetGPValue(), _in_dems];

        /// <summary>
        /// <para>Input OIS Features</para>
        /// <para>The multipatch features with defined Airport schema. The feature class must be z-enabled.</para>
        /// <para>具有定义的 Airport 模式的多面体功能。要素类必须启用 z 功能。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input OIS Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _input_ois_features { get; set; }


        /// <summary>
        /// <para>Input Obstacle Features</para>
        /// <para>The input obstacle features that will be analyzed. The feature class must be z-enabled.</para>
        /// <para>将要分析的输入障碍物特征。要素类必须启用 z 功能。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Obstacle Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _input_obstacle_features { get; set; }


        /// <summary>
        /// <para>Output Obstacle Feature Class</para>
        /// <para>A feature class containing one point for each obstacle feature that falls within the area covered by the input OIS. If the geometry type of the input obstacle feature is a polyline or polygon, a multipoint feature class will be created.</para>
        /// <para>一个要素类，其中包含位于输入 OIS 覆盖区域内的每个障碍物要素的一个点。如果输入障碍物要素的几何类型为折线或面，则将创建多点要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Obstacle Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>Obstacle Height</para>
        /// <para><xdoc>
        ///   <para>The field containing the height of the obstacle features. The default value is Feature Geometry.</para>
        ///   <bulletList>
        ///     <bullet_item>Feature Geometry—The field containing the height of the obstacle features.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>包含障碍物要素高度的字段。默认值为要素几何。</para>
        ///   <bulletList>
        ///     <bullet_item>要素几何 - 包含障碍物要素高度的字段。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Obstacle Height")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _height_field_value _height_field { get; set; } = _height_field_value._FEATURE_GEOMETRY;

        public enum _height_field_value
        {
            /// <summary>
            /// <para>Feature Geometry</para>
            /// <para>Feature Geometry—The field containing the height of the obstacle features.</para>
            /// <para>要素几何 - 包含障碍物要素高度的字段。</para>
            /// </summary>
            [Description("Feature Geometry")]
            [GPEnumValue("FEATURE_GEOMETRY")]
            _FEATURE_GEOMETRY,

        }

        /// <summary>
        /// <para>Unit</para>
        /// <para><xdoc>
        ///   <para>Specifies the linear unit of the obstacle height.</para>
        ///   <bulletList>
        ///     <bullet_item>Kilometers—The linear unit is kilometers.</bullet_item><para/>
        ///     <bullet_item>Meters—The linear unit is meters.</bullet_item><para/>
        ///     <bullet_item>Decimeters—The linear unit is decimeters.</bullet_item><para/>
        ///     <bullet_item>Centimeters—The linear unit is centimeters.</bullet_item><para/>
        ///     <bullet_item>Millimeters—The linear unit is millimeters.</bullet_item><para/>
        ///     <bullet_item>Nautical miles—The linear unit is nautical miles.</bullet_item><para/>
        ///     <bullet_item>Miles—The linear unit is miles.</bullet_item><para/>
        ///     <bullet_item>Yards—The linear unit is yards.</bullet_item><para/>
        ///     <bullet_item>Feet—The linear unit is feet.</bullet_item><para/>
        ///     <bullet_item>Inches—The linear unit is inches.</bullet_item><para/>
        ///     <bullet_item>Decimal degrees—The linear unit is decimal degrees.</bullet_item><para/>
        ///     <bullet_item>Points—The linear unit is points.</bullet_item><para/>
        ///     <bullet_item>Unknown—The linear unit is unknown.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定障碍物高度的线性单位。</para>
        ///   <bulletList>
        ///     <bullet_item>千米—线性单位为千米。</bullet_item><para/>
        ///     <bullet_item>米 - 线性单位为米。</bullet_item><para/>
        ///     <bullet_item>分米 - 线性单位为分米。</bullet_item><para/>
        ///     <bullet_item>厘米—线性单位为厘米。</bullet_item><para/>
        ///     <bullet_item>毫米 - 线性单位为毫米。</bullet_item><para/>
        ///     <bullet_item>海里 - 线性单位为海里。</bullet_item><para/>
        ///     <bullet_item>英里—线性单位为英里。</bullet_item><para/>
        ///     <bullet_item>码 - 线性单位为码。</bullet_item><para/>
        ///     <bullet_item>英尺 - 线性单位为英尺。</bullet_item><para/>
        ///     <bullet_item>英寸—线性单位为英寸。</bullet_item><para/>
        ///     <bullet_item>十进制度 - 线性单位为十进制度。</bullet_item><para/>
        ///     <bullet_item>点数 （Points） - 线性单位为点。</bullet_item><para/>
        ///     <bullet_item>未知 - 线性单位未知。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Unit")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _unit_field_value _unit_field { get; set; } = _unit_field_value._METERS;

        public enum _unit_field_value
        {
            /// <summary>
            /// <para>Kilometers</para>
            /// <para>Kilometers—The linear unit is kilometers.</para>
            /// <para>千米—线性单位为千米。</para>
            /// </summary>
            [Description("Kilometers")]
            [GPEnumValue("KILOMETERS")]
            _KILOMETERS,

            /// <summary>
            /// <para>Meters</para>
            /// <para>Meters—The linear unit is meters.</para>
            /// <para>米 - 线性单位为米。</para>
            /// </summary>
            [Description("Meters")]
            [GPEnumValue("METERS")]
            _METERS,

            /// <summary>
            /// <para>Decimeters</para>
            /// <para>Decimeters—The linear unit is decimeters.</para>
            /// <para>分米 - 线性单位为分米。</para>
            /// </summary>
            [Description("Decimeters")]
            [GPEnumValue("DECIMETERS")]
            _DECIMETERS,

            /// <summary>
            /// <para>Centimeters</para>
            /// <para>Centimeters—The linear unit is centimeters.</para>
            /// <para>厘米—线性单位为厘米。</para>
            /// </summary>
            [Description("Centimeters")]
            [GPEnumValue("CENTIMETERS")]
            _CENTIMETERS,

            /// <summary>
            /// <para>Millimeters</para>
            /// <para>Millimeters—The linear unit is millimeters.</para>
            /// <para>毫米 - 线性单位为毫米。</para>
            /// </summary>
            [Description("Millimeters")]
            [GPEnumValue("MILLIMETERS")]
            _MILLIMETERS,

            /// <summary>
            /// <para>Nautical miles</para>
            /// <para>Nautical miles—The linear unit is nautical miles.</para>
            /// <para>海里 - 线性单位为海里。</para>
            /// </summary>
            [Description("Nautical miles")]
            [GPEnumValue("NAUTICAL_MILES")]
            _NAUTICAL_MILES,

            /// <summary>
            /// <para>Miles</para>
            /// <para>Miles—The linear unit is miles.</para>
            /// <para>英里—线性单位为英里。</para>
            /// </summary>
            [Description("Miles")]
            [GPEnumValue("MILES")]
            _MILES,

            /// <summary>
            /// <para>Yards</para>
            /// <para>Yards—The linear unit is yards.</para>
            /// <para>码 - 线性单位为码。</para>
            /// </summary>
            [Description("Yards")]
            [GPEnumValue("YARDS")]
            _YARDS,

            /// <summary>
            /// <para>Feet</para>
            /// <para>Feet—The linear unit is feet.</para>
            /// <para>英尺 - 线性单位为英尺。</para>
            /// </summary>
            [Description("Feet")]
            [GPEnumValue("FEET")]
            _FEET,

            /// <summary>
            /// <para>Inches</para>
            /// <para>Inches—The linear unit is inches.</para>
            /// <para>英寸—线性单位为英寸。</para>
            /// </summary>
            [Description("Inches")]
            [GPEnumValue("INCHES")]
            _INCHES,

            /// <summary>
            /// <para>Decimal degrees</para>
            /// <para>Decimal degrees—The linear unit is decimal degrees.</para>
            /// <para>十进制度 - 线性单位为十进制度。</para>
            /// </summary>
            [Description("Decimal degrees")]
            [GPEnumValue("DECIMAL_DEGREES")]
            _DECIMAL_DEGREES,

            /// <summary>
            /// <para>Points</para>
            /// <para>Points—The linear unit is points.</para>
            /// <para>点数 （Points） - 线性单位为点。</para>
            /// </summary>
            [Description("Points")]
            [GPEnumValue("POINTS")]
            _POINTS,

            /// <summary>
            /// <para>Unknown</para>
            /// <para>Unknown—The linear unit is unknown.</para>
            /// <para>未知 - 线性单位未知。</para>
            /// </summary>
            [Description("Unknown")]
            [GPEnumValue("UNKNOWN")]
            _UNKNOWN,

        }

        /// <summary>
        /// <para>Obstacle Features</para>
        /// <para><xdoc>
        ///   <para>Specifies how obstacle height values will be interpreted.</para>
        ///   <bulletList>
        ///     <bullet_item>Absolute height— Obstacle heights are measured from sea level. This is the default.</bullet_item><para/>
        ///     <bullet_item>Relative height— Obstacle heights are measured from ground level.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定如何解释障碍物高度值。</para>
        ///   <bulletList>
        ///     <bullet_item>绝对高度 - 障碍物高度是从海平面测量的。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>相对高度 - 障碍物高度是从地面测量的。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Obstacle Features")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _height_option_value _height_option { get; set; } = _height_option_value._ABSOLUTE_HEIGHT;

        public enum _height_option_value
        {
            /// <summary>
            /// <para>Absolute height</para>
            /// <para>Absolute height— Obstacle heights are measured from sea level. This is the default.</para>
            /// <para>绝对高度 - 障碍物高度是从海平面测量的。这是默认设置。</para>
            /// </summary>
            [Description("Absolute height")]
            [GPEnumValue("ABSOLUTE_HEIGHT")]
            _ABSOLUTE_HEIGHT,

            /// <summary>
            /// <para>Relative height</para>
            /// <para>Relative height— Obstacle heights are measured from ground level.</para>
            /// <para>相对高度 - 障碍物高度是从地面测量的。</para>
            /// </summary>
            [Description("Relative height")]
            [GPEnumValue("RELATIVE_HEIGHT")]
            _RELATIVE_HEIGHT,

        }

        /// <summary>
        /// <para>Elevations</para>
        /// <para><xdoc>
        ///   <para>Specifies how obstacle base elevation heights are identified. This parameter is enabled if the Obstacle Features parameter is set to Relative height.</para>
        ///   <bulletList>
        ///     <bullet_item>Elevation field— Base elevation heights are derived from a numeric field of the obstacle feature class. This is the default.</bullet_item><para/>
        ///     <bullet_item>Elevation DEM— Base elevation heights are derived from one or more DEMs.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定如何识别障碍物基础高程高度。如果障碍物要素参数设置为相对高度，则启用此参数。</para>
        ///   <bulletList>
        ///     <bullet_item>高程字段- 基本高程高度派生自障碍物要素类的数值字段。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>高程 DEM— 基本高程高度派生自一个或多个 DEM。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Elevations")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _elevation_option_value _elevation_option { get; set; } = _elevation_option_value._ELEVATION_FIELD;

        public enum _elevation_option_value
        {
            /// <summary>
            /// <para>Elevation field</para>
            /// <para>Elevation field— Base elevation heights are derived from a numeric field of the obstacle feature class. This is the default.</para>
            /// <para>高程字段- 基本高程高度派生自障碍物要素类的数值字段。这是默认设置。</para>
            /// </summary>
            [Description("Elevation field")]
            [GPEnumValue("ELEVATION_FIELD")]
            _ELEVATION_FIELD,

            /// <summary>
            /// <para>Elevation DEM</para>
            /// <para>Elevation DEM— Base elevation heights are derived from one or more DEMs.</para>
            /// <para>高程 DEM— 基本高程高度派生自一个或多个 DEM。</para>
            /// </summary>
            [Description("Elevation DEM")]
            [GPEnumValue("ELEVATION_DEM")]
            _ELEVATION_DEM,

        }

        /// <summary>
        /// <para>Elevation Field</para>
        /// <para><xdoc>
        ///   <para>The field containing base elevation heights of the obstacle features.</para>
        ///   <para>This parameter is active if the Obstacle Features parameter is set to Relative height and the Elevations parameter is set to Elevation field. The default is the first numeric field in the obstacle feature class.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>包含障碍物要素的基高程高度的字段。</para>
        ///   <para>如果障碍物要素参数设置为相对高度，并且高程参数设置为高程字段，则此参数处于活动状态。默认值为障碍物要素类中的第一个数值字段。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Elevation Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _elevation_field { get; set; } = null;


        /// <summary>
        /// <para>Elevation Field Units</para>
        /// <para>Specifies the linear unit of the base elevation values. This parameter is active if the Obstacle Features parameter is set to Relative height and the Elevations parameter is set to Elevation field.</para>
        /// <para>指定基本高程值的线性单位。如果障碍物要素参数设置为相对高度，并且高程参数设置为高程字段，则此参数处于活动状态。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Elevation Field Units")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _elevation_field_unit_value _elevation_field_unit { get; set; } = _elevation_field_unit_value._METERS;

        public enum _elevation_field_unit_value
        {
            /// <summary>
            /// <para>Kilometers</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Kilometers")]
            [GPEnumValue("KILOMETERS")]
            _KILOMETERS,

            /// <summary>
            /// <para>Meters</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Meters")]
            [GPEnumValue("METERS")]
            _METERS,

            /// <summary>
            /// <para>Decimeters</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Decimeters")]
            [GPEnumValue("DECIMETERS")]
            _DECIMETERS,

            /// <summary>
            /// <para>Centimeters</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Centimeters")]
            [GPEnumValue("CENTIMETERS")]
            _CENTIMETERS,

            /// <summary>
            /// <para>Millimeters</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Millimeters")]
            [GPEnumValue("MILLIMETERS")]
            _MILLIMETERS,

            /// <summary>
            /// <para>Nautical miles</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Nautical miles")]
            [GPEnumValue("NAUTICAL_MILES")]
            _NAUTICAL_MILES,

            /// <summary>
            /// <para>Miles</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Miles")]
            [GPEnumValue("MILES")]
            _MILES,

            /// <summary>
            /// <para>Yards</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Yards")]
            [GPEnumValue("YARDS")]
            _YARDS,

            /// <summary>
            /// <para>Feet</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Feet")]
            [GPEnumValue("FEET")]
            _FEET,

            /// <summary>
            /// <para>Inches</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Inches")]
            [GPEnumValue("INCHES")]
            _INCHES,

            /// <summary>
            /// <para>Decimal degrees</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Decimal degrees")]
            [GPEnumValue("DECIMAL_DEGREES")]
            _DECIMAL_DEGREES,

            /// <summary>
            /// <para>Points</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Points")]
            [GPEnumValue("POINTS")]
            _POINTS,

            /// <summary>
            /// <para>Unknown</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Unknown")]
            [GPEnumValue("UNKNOWN")]
            _UNKNOWN,

        }

        /// <summary>
        /// <para>Input Elevation Model</para>
        /// <para>The DEMs covering the obstacles, used to derive base elevation values. This parameter is active if the Obstacle Features parameter is set to Relative height and the Elevations parameter is set to Elevation DEM.</para>
        /// <para>覆盖障碍物的 DEM，用于导出基本高程值。如果障碍物要素参数设置为相对高度，并且高程参数设置为高程 DEM，则此参数处于活动状态。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Elevation Model")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _in_dems { get; set; } = null;


        public AnalyzeRunwayObstacles SetEnv(object workspace = null)
        {
            base.SetEnv(workspace: workspace);
            return this;
        }

    }

}